接下來我們要針對複雜度做介紹,首先要說的就是高手們常常說的「Big O」! 但是到底什麼是 big O notation 呢?
在電腦科學中,big O 可以幫助我們分析演算法效率:
設, ,且存在一正數 C 與一數 N 使得 for all ,則 。
也就是說,當 n 夠大時,g(n) 的影響力會比 f(n) 大。
舉個例子:
而
可以發現,在計算 Big O 時,我們是忽略掉常數項不計的。
由 nodes 與 edges 交織而成。
nodes 可以理解為一個點的位置,而 edges 則是通往別的點的路徑,與兩點中間若有 edge,即稱這兩個點為 neighbors,而一個 node 有多少 neighbor 就代表他有多少 degree。
Edges有兩個種類:
Path
path 又稱為 route,以上圖為例:若我們想要從 node1 走到 node6,我們有好幾種方式:
(1, 5, 4, 6)、(1, 2 ,3 ,4, 6)、(1, 3, 4, 6)。
Cycle
若ㄧ路徑起點與終點相同,則我們稱此為一個 cycle。
一個不含 cycle 的path稱作「simple path」。
一個不含 cycle的graph稱作「acyclic graph」。
Weights
我們可以在每條 edge 上添加上數字,代表 distance、cost 等等。
例如:
(1, 2, 3, 4) 的距離即為13。
由於在程式碼不能讀取我們的圖,但是可以用adjacency matrix來儲存graph的資訊,不過有的時候,adjacency matrix會太佔空間,因此也很常用另一種方式:adjacency list。
如果我們想要存誰是neighbors,只要是 neighbors 就在 matrix 中以 1 表示。
一個 graph 可以表達很多資訊,例如我們想找到各點的最短路徑的話,可以將所有最短路徑畫成一個樹狀圖如下圖。
而依照此樹狀圖,有兩種演算法可以幫助我們做搜尋 nodes,分別為:
這邊有一篇文章我認為講得十分清楚,附上網址給大家做參考:深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法,實用的節點搜尋法